#include "context.h"

QM_P init_queue_manage()
{
    // 管理结构体申请堆空间
    QM_P queue = malloc(sizeof(QM));
    if (queue == NULL)
        return NULL;
    // 管理结构体初始化
    queue->head = queue->tail = -1;
    queue->size = 0;
    // 队列成员申请堆空间
    for (int i = 0; i < MAX_CONTEXT; i++)
        queue->data = malloc(1024 * MAX_CONTEXT);
    
    return queue;
}

int en_queue(QM_P queue, char *data)
{
    // 处理指针
    if (MAX_CONTEXT == queue->size) // 如果队列满 先出队再入队
        de_queue(queue, NULL);

    if (0 == queue->size) // 第一个元素入队
    {
        queue->head = queue->tail = 0; // 头尾位序指向第一个元素
    }
    else
    {
        queue->tail++;
        queue->tail %= MAX_CONTEXT;
    }

    // 放入数据
    strcpy(queue->data[queue->tail],data);
    queue->size++;
    return 0;
}

int de_queue(QM_P queue, char *data)
{
    if (0 == queue->size) // 队列空出队失败
        return -1;

    // 取出数据
    // *data = queue->data[queue->head];
    queue->head++;
    queue->head %= MAX_CONTEXT;
    queue->size--;
    return 0;
}

int get_context(QM_P queue, char (*data)[1024])
{
    for (int i = 0, index = queue->head; i < queue->size; i++)
    {
        strcpy(data[i], queue->data[index]);
        index++;
        index %= MAX_CONTEXT;
    }
}

void show(QM_P queue)
{
    for (int i = 0, index = queue->head; i < queue->size; i++)
    {
        printf("%s ", queue->data[index]);
        index++;
        index %= MAX_CONTEXT;
    }
    printf("\n");
}

void destory_queue(QM_P queue)
{
    // 释放管理结构体所占用的内存空间
    free(queue);
}

// int main(int argc, char const *argv[])
// {
//     QM_P queue = init_queue_manage();
//     for (int i = 0; i < 10; i++)
//     {
//         char temp[10];
//         sprintf(temp,"%s%d","test:",i);
//         en_queue(queue, temp);
//     }

//     show(queue);

//     int data;
//     for (int i = 0; i < 5; i++)
//     {
//         de_queue(queue, NULL);
//         printf("queue element: %d\n", data);
//     }
//     show(queue);

//     destory_queue(queue);
//     queue = NULL;
//     return 0;
// }
